#include "los_task.h"
#include "ohos_init.h"
#include "iot_gpio.h"
#include "iot_errno.h"
#include "los_swtmr.h"
#include <stdio.h>

// 消毒设备控制引脚
#define GPIO_FAN GPIO0_PA2

// 全局变量：消毒控制参数
static int g_heaterLevel = 1; // 消毒强度挡位（1-3）
static int d_dryTimeSec = 0;  // 总时间
static int d_isRunning = 0;   // 运行状态（0：停止 1：启动中 2：运行中）

static unsigned int g_heatPwmTimerId; // 消毒定时器ID
static unsigned int d_stopTimerId;    // 停止定时器ID

/**
 * 消毒停止定时器回调，时间到了自动关闭
 */
void StopTimer()
{
    printf("[消毒系统] 消毒完成，自动关闭\n");

    // 关闭消毒设备
    IoTGpioSetOutputVal(GPIO_FAN, IOT_GPIO_VALUE0);

    d_isRunning = 0;

    // 检查设备是否真的关闭
    unsigned int fanVal = 1; // 默认设为高电平
    if (IoTGpioGetOutputVal(GPIO_FAN, &fanVal) == IOT_SUCCESS)
    {
        if (fanVal == IOT_GPIO_VALUE0)
        {
            printf("[消毒系统] 消毒设备已确认关闭\n");
        }
        else
        {
            printf("[警告] 消毒设备仍未关闭，请检查硬件！\n");
        }
    }
    else
    {
        printf("[错误] 无法读取消毒设备状态\n");
    }
}

/**
 * 消毒控制主任务
 */
/**
 * 任务函数改造版：不再进行加热循环，只监听状态
 */
void disinfect_task()
{
    // 初始化 GPIO
    IoTGpioInit(GPIO_FAN);
    IoTGpioSetDir(GPIO_FAN, IOT_GPIO_DIR_OUT);

    // 创建定时器（只创建一次）
    unsigned int ret;

    // 创建停止定时器 (用于总时长控制)
    ret = LOS_SwtmrCreate(1000,                // <--- 使用临时间隔 (1秒)
                          LOS_SWTMR_MODE_ONCE, // <--- 单次模式
                          StopTimer,           // <--- 绑定停止回调 (确保签名正确)
                          &d_stopTimerId,      // <--- 使用停止 ID
                          0);                  // <--- 参数为 0
    if (ret != LOS_OK)
    {
        printf("错误：创建停止定时器失败: 0x%x\n", ret);
        LOS_SwtmrDelete(g_heatPwmTimerId); // 清理已创建的 PWM 定时器
        return;                            // 任务无法继续
    }

    printf("任务初始化完成，等待启动...\n"); // 添加日志

    while (1)
    {
        if (d_isRunning == 1)
        {     
            IoTGpioSetOutputVal(GPIO_FAN, IOT_GPIO_VALUE0);                                                                                   // 运行状态
            printf("[任务] 收到启动请求 (Level: %d, Time: %ds)\n", g_heaterLevel, d_dryTimeSec); // 添加日志

            if (IoTGpioSetOutputVal(GPIO_FAN, IOT_GPIO_VALUE1) == IOT_SUCCESS)
            { // <--- 检查 IOT_SUCCESS
                printf("[任务] 消毒启动成功！\n");
            }
            else
            {
                printf("[任务] 错误：启动消毒失败！\n");
                d_isRunning = 0;
                return;
            }
            // 3.4 配置并启动停止定时器 <--- 添加配置步骤
            LOS_SwtmrStop(d_stopTimerId); // 先停止一次，确保状态干净

            // 直接使用一次性定时器，时间设置为总消毒时间
            ret = LOS_SwtmrCreate(d_dryTimeSec * 1000, // 设置为总时长（毫秒）
                                  LOS_SWTMR_MODE_ONCE, // 单次模式
                                  StopTimer,           // 停止回调
                                  &d_stopTimerId,      // 定时器ID
                                  0);                  // 参数

            if (ret == LOS_OK)
            {
                // 设置成功，现在启动它
                ret = LOS_SwtmrStart(d_stopTimerId);
                if (ret != LOS_OK)
                {
                    printf("[任务] 错误：启动停止定时器失败: 0x%x\n", ret);
                    LOS_SwtmrStop(g_heatPwmTimerId);                // 停止已启动的 PWM 定时器
                    IoTGpioSetOutputVal(GPIO_FAN, IOT_GPIO_VALUE0); // 关闭
                    d_isRunning = 0;
                    return;
                }
                else
                {
                    printf("[任务] 停止定时器已配置并启动 (时长: %d 秒)\n", d_dryTimeSec);
                }
            }
            else
            {
                // 设置超时失败 (可能函数不可用或参数错误)
                printf("[任务] 错误：设置停止定时器超时失败: 0x%x (LOS_SwtmrSetTimeout?)\n", ret);
                LOS_SwtmrStop(g_heatPwmTimerId);                // 停止已启动的 PWM 定时器
                IoTGpioSetOutputVal(GPIO_FAN, IOT_GPIO_VALUE0); // 关闭
                d_isRunning = 0;
                return;
            }

            // 3.5 更新运行状态 <--- 添加此步骤
            d_isRunning = 2; // 所有启动步骤成功，将状态设置为“运行中”
            printf("[任务] 所有组件启动成功，系统进入运行状态。\n");
        }
        LOS_Msleep(200);
    }
}

/**
 * 提供接口函数用于外部控制启动消毒
 */
void disinfect_start(int level, int durationSec)
{
    if (level < 1 || level > 3 || durationSec <= 0)
    {
        printf("参数不合法\n");
        return;
    }
    g_heaterLevel = level;
    d_dryTimeSec = durationSec;
    d_isRunning = 1; // 触发主任务启动一次
}

/**
 * 应用入口函数（开机执行）
 */
void disinfect_init(int disinfectTime)
{
    unsigned int thread_id;
    TSK_INIT_PARAM_S task = {0};
    task.pfnTaskEntry = (TSK_ENTRY_FUNC)disinfect_task;
    task.uwStackSize = 4096;
    task.pcName = "disinfect_task";
    task.usTaskPrio = 10;
    if (LOS_TaskCreate(&thread_id, &task) != LOS_OK)
    {
        printf("Failed to create disinfect_task\n");
    }
    disinfect_start(2, disinfectTime);
}
